package tp1POO;

import GUI.GuiCreator;

import java.util.List;
import java.util.Vector;

import tp1POO.Modelo.Cliente;
import tp1POO.Modelo.Funcionario;
import tp1POO.Modelo.Locacao;
import tp1POO.Modelo.Motorista;
import tp1POO.Modelo.Tipo;
import tp1POO.Modelo.Veiculo;
import tp1POO.Persistencia.GerenciadorObjetos;
import tp1POO.Persistencia.Pesquisa;

public class Verifica {

	/**
	 * Verifica se o nome do cliente é váilido.
	 * @param nome - nome a ser verificado.
	 * @return String - mensagem que contém os erros encontrados. Retorna uma String vazia se nenhum erro
	 * for encontrado.
	 */
	public static String nomeCliente (String nome) {
		String msg="";

		Cliente cliente = Pesquisa.ObterClienteNome(nome);
		if (cliente != null) {
			msg = msg + "ERRO : Cliente "+ cliente.getNome()+" já existe!\n";
			return msg;
		}
		else if (nome.isEmpty()) {
			msg = msg + "ERRO : Nome inválido!\n";
			return msg;
		}


		return msg;
	}

	/**
	 * Verifica se o CPF do cliente é váilido.
	 * @param cpf - cpf a ser verificado.
	 * @return String - mensagem que contém os erros encontrados. Retorna uma String vazia se nenhum erro
	 * for encontrado.
	 */
	public static String cpfCliente (String cpf) {
		String msg="";
		Cliente cliente = Pesquisa.ObterClienteCpf(cpf);

		if (cpf.length() != 11) {
			msg = msg + "ERRO : CPF deve conter 11 caracteres!\n";
			return msg;
		}
		else if(cliente != null) {
			msg = msg + "ERRO : O CPF "+cliente.getCpf()+" já existe!\n";
			return msg;
		}
		else if (cpf.isEmpty()) {
			msg = "ERRO : CPF inválido!\n";
			return msg;
		}
		for (int i=0;i<11;i++) {
			char aux = cpf.charAt(i);
			if (aux < 48 || aux > 57) {
				msg = "ERRO : O CPF não deve conter letras!\n";
				return msg;
			}
		}

		return msg;
	}

	/**
	 * Verifica se a placa do veículo é váilido.
	 * @param placa - placa a ser verificado.
	 * @return String - mensagem que contém os erros encontrados. Retorna uma String vazia se nenhum erro
	 * for encontrado.
	 */
	public static String placaVeiculo (String placa) {
		String msg="";
		Veiculo veiculo = Pesquisa.ObterVeiculo(placa);
		if (veiculo != null) {
			msg = msg + "ERRO : Veiculo com a placa "+veiculo.getPlaca()+" já existe!\n";
			return msg;
		}
		else if (placa.isEmpty()) {
			msg = msg + "ERRO : Placa inválido!\n";
			return msg;
		}

		return msg;
	}

	/**
	 * Verifica se o nome do funcionário é váilido.
	 * @param nome - Nome a ser verificado.
	 * @return String - mensagem que contém os erros encontrados. Retorna uma String vazia se nenhum erro
	 * for encontrado.
	 */
	public static String nomeFuncionario (String nome) {
		String msg="";
		Funcionario funcionario = Pesquisa.ObterFuncionarioNome(nome);
		if (funcionario != null) {
			msg = msg +"ERRO : Funcionario com nome "+funcionario.getNome()+" já existe!\n";
			return msg;
		}
		else if (nome.isEmpty()) {
			msg = msg + "ERRO : Nome inválido!\n";
			return msg;
		}

		return msg;
	}

	/**
	 * Verifica se o CPF do funcionário é váilido.
	 * @param cpf - CPF a ser verificado.
	 * @return String - mensagem que contém os erros encontrados. Retorna uma String vazia se nenhum erro
	 * for encontrado.
	 */
	public static String cpfFuncionario (String cpf) {
		String msg = "";
		Funcionario funcionario = Pesquisa.obterFuncionario(cpf);

		if (cpf.length() != 11) {
			msg = msg + "ERRO : CPF deve conter 11 caracteres!\n";
			return msg;
		}
		else if (cpf.isEmpty()) {
			msg = "ERRO : CPF inválido!\n";
			return msg;
		}
		else if(funcionario != null) {
			msg = msg + "ERRO : Um funcionario com o CPF "+funcionario.getCpf()+" já existe!\n";
			return msg;
		}
		for (int i=0;i<11;i++) {
			char aux = cpf.charAt(i);
			if (aux < 48 || aux > 57) {
				msg = "ERRO : O CPF não deve conter letras!\n";
				return msg;
			}
		}

		return msg;
	}

	/**
	 * Verifica se o nome do motorista é váilido.
	 * @param nome - Nome a ser verificado.
	 * @return String - mensagem que contém os erros encontrados. Retorna uma String vazia se nenhum erro
	 * for encontrado.
	 */
	public static String nomeMotorista (String nome) {
		String msg="";
		Motorista motorista = Pesquisa.ObterMotoristaNome(nome);
		if (motorista != null) {
			msg = msg + "ERRO : Motorista "+motorista.getNome()+" já existe!\n";
			return msg;
		}
		else if (nome.isEmpty()) {
			msg = msg + "ERRO : Nome inválido!\n";
			return msg;
		}

		return msg;
	}

	/**
	 * Verifica se o CNH do motorista é váilido.
	 * @param cnh - CNH a ser verificado.
	 * @return String - mensagem que contém os erros encontrados. Retorna uma String vazia se nenhum erro
	 * for encontrado.
	 */
	public static String cnhMotorista (String cnh) {
		String msg = "";
		Motorista motorista = Pesquisa.ObterMotoristaCnh(cnh);
		if (motorista != null) {
			msg = msg + "ERRO : Motorista com CNH "+motorista.getCNH()+" já existe!\n";
			return msg;
		}
		else if (cnh.isEmpty()) {
			msg = msg + "ERRO : CNH inválido!\n";
			return msg;
		}
		for (int i=0;i<cnh.length();i++) {
			char aux = cnh.charAt(i);
			if (aux < 48 || aux > 57) {
				msg = "ERRO : O CNH não deve conter letras!\n";
				return msg;
			}
		}

		return msg;
	}

	/**
	 * Verifica se o CPF do motorista é váilido.
	 * @param cpf - CPF a ser verificado.
	 * @return String - mensagem que contém os erros encontrados. Retorna uma String vazia se nenhum erro
	 * for encontrado.
	 */
	public static String cpfMotorista (String cpf)	{
		String msg = "";
		Motorista motorista = Pesquisa.ObterMotoristaCpf(cpf);

		if (motorista != null) {
			msg = msg + "CPF : Motorista com CPF "+motorista.getCpf()+" já existe!";
			return msg;
		}
		if (cpf.length() != 11) {
			msg = msg + "ERRO : CPF deve conter 11 caracteres!\n";
			return msg;
		}
		else if (cpf.isEmpty()) {
			msg = "ERRO : CPF inválido!\n";
			return msg;
		}
		for (int i=0;i<11;i++) {
			char aux = cpf.charAt(i);
			if (aux < 48 || aux > 57) {
				msg = "ERRO : O CPF não deve conter letras!\n";
				return msg;
			}
		}

		return msg;
	}

	/**
	 * Verifica se os dados de um novo tipo de locação são válidos.
	 * @param nome - nome do tipo de locação a ser verificado.
	 * @param taxa - String que contém a taxa do tipo de locação a ser verificado.
	 * @param km - String que contém o preço por Km do tipo de locação a ser verificado.
	 * @return String - mensagem que contém os erros encontrados. Retorna uma String vazia se nenhum erro
	 * for encontrado.
	 */
	public static String tipoLocacao (String nome,String taxa,String km) {
		String msg="";

		if (taxa.isEmpty()) {
			msg = msg + "ERRO : Taxa base Inválida!\n";
		}
		if (km.isEmpty()) {
			msg = msg + "ERRO : Preço por Km Inválido!\n";
		}

		if (nome.isEmpty()) {
			msg = msg + "ERRO : Nome Inválido!\n";
		}
		else if (!nome.isEmpty()&&!taxa.isEmpty()&&!km.isEmpty()) {
			Tipo tipo = Pesquisa.obterTipoLocacao(nome);
			if (tipo != null) {
				msg = msg + "ERRO : Tipo "+nome+" já existe!\n";
			}
			for (int i=0;i<taxa.length();i++) {
				if (taxa.charAt(i) < 48 || taxa.charAt(i) > 57) {
					msg = msg + "ERRO : A taxa não deve conter letras!\n";
					break;
				}
			}
			for (int i=0;i<km.length();i++) {
				if (km.charAt(i) < 48 || km.charAt(i) > 57) {
					msg = msg + "ERRO : O preço por Km não deve conter letras!\n";
					break;
				}
			}
		}

		return msg;
	}

	/**
	 * Verifica se os dados de uma nova locação são váilidos.
	 * @param nome - nome do cliente da locação a ser verificada.
	 * @param placa - placa do veículo da locação a ser verificada.
	 * @param  data - data de origem da locação a ser verificada.
	 * @return String - mensagem que contém os erros encontrados. Retorna uma String vazia se nenhum erro
	 * for encontrado.
	 */
	public static String Locacao (String nome, String placa, String data) {
		String msg = "";
		Locacao locacao = Pesquisa.ObterLocacao(nome, placa, data);
		if (locacao != null) {
			msg = msg + "Locação já existe!\n";
		}

		return msg;
	}

	/**
	 * Fecha uma locação e retira as dependências, como liberar a locação dos motoristas,
	 * para que estes possam  realizar novas locações.
	 * @param loc - locação a ser removida.
	 */
	public static void dependenciaLocacao(Locacao loc) {
		String msg="";

		loc.fecharLocacao();
                GerenciadorObjetos.obterInstancia().salvarObj(loc);
		//Pesquisa.removeLocacao(loc.getLocador().getNome(), loc.getVeiculo().getPlaca(), loc.getDataSaida());
		msg = msg + "Locacao Fechada. Valores:\n      Data de Saida: " + loc.getDataSaida()+"\n";
		msg = msg + "      Data de Entrada: " + loc.getDataDevolucao()+"\n";
		msg = msg + "      Tipo de Locacao: " + loc.getTipoLocacao()+"\n";
		msg = msg + "\nValor Final:\tR$" + loc.getValor()+"\n";
		GuiCreator.obterInstancia().exibirMensagem(msg);
	}

	/**
	 * Remove um cliente e fecha suas locações pendentes.
	 * @param nome - nome do cliente a ser removido.
	 * @return String - mensagem que contém os erros encontrados. Retorna uma String vazia se nenhum erro
	 * for encontrado.
	 */
	public static String dependenciaCliente(String nome) {
		String msg="";
		boolean erro=true;
		Cliente cliente;
		List<Locacao> vetLoc;

		cliente = Pesquisa.ObterClienteNome(nome);
		if (cliente != null) {
			vetLoc = cliente.getLocacoes();
			if (!vetLoc.isEmpty()) {
				for (Locacao loc : vetLoc) {
					if (loc.getValor() == 0) {
						msg = msg + "ERRO : O cliente "+nome+" ainda possui locações pendentes!\n";
					}
				}
			}
			else {
				erro = Pesquisa.removeCliente(nome);
				if (!erro) {
					msg = msg + "Cliente não existe!\n";
				}
			}
		}
		else {
			msg = msg + "Cliente não existe!\n";
		}

		return msg;
	}
}
